package fileOperator;

import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

public class FileOperatorMain {
    // 采用递归的方式清空文件夹
    // 复制单个文件到指定位置
    // 复制单个文件或一个文件夹到指定位置
    public void allin(File file){
        // 判断是不是文件夹,是就遍历,不是直接删
        if(file.isDirectory()){
            for(File f:file.listFiles()) {
                allin(f);
                // 递归完把自己也删了
                f.delete();
            }
        } else {
            // 不是文件夹, 直接删
            // 已经把自己删掉,不用执行最后一步,直接弹栈,回到调用处
            file.delete();
            return;
        }
        // 最后把要删的文件夹删掉
        file.delete();
    }

    public void FileCopy(FileOutputStream fos, FileInputStream fis){
        // 字节流拷贝单个文件, 采用字节数组缓冲区
        byte[] by_arr = new byte[8192];
        int len;
        try {
            while ((len = fis.read(by_arr)) != -1){
                fos.write(by_arr, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关流
            if(fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fis != null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("文件复制完成");
    }

    private void FileCopyTool(File file, String str1, String str2){
        // file: 要复制的文件; str1: 目标文件夹; str2: 新文件名
        // 工具方法,用于
        // 递归方法,用于实现文件夹递归
        // 如果是文件夹,遍历文件夹下每个文件并判断
        if(file.isDirectory()){
            for (File lf : file.listFiles()) {
                FileCopyTool(lf, str1, str2);
            }
        } else {
            // 拼接目标文件夹,判断文件夹是否存在
            // D:\Tool\自制小东西\小东西\关闭鸣谢\关闭鸣谢.html
            // str1 -- D:\demo          str2 -- D:\Tool
            // str3 = D:\demo\自制小东西\小东西\关闭鸣谢
            // 确保文件复制之前目录存在
            String str3 = str1 + (file.getPath().replace("\\" + file.getName(), "")).replace(str2, "");
            File file2 = new File(str3);
            if(file2.exists()){
                try {
                    // 文件夹存在,直接复制
                    FileCopy(new FileOutputStream(str3 + "\\" + file.getName()), new FileInputStream(file));
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            } else {
                // 文件夹不存在, 先创建目录
                file2.mkdirs();
                try {
                    FileCopy(new FileOutputStream(str3 + "\\" + file.getName()), new FileInputStream(file));
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void FileCopy(String tc, String name, File file){
        // 方法重载
        // tc : target catalogue 目标目录
        // file是要复制的文件, 可以是文件或文件夹
        // name: 目标文件可以改名, 暂时只限单个文件
        // 将文件复制到指定目录, 不管目录存不存在
        if(file.isDirectory()){
            // 传入的是文件夹, 进工具方法
            // tc -- D:\demo       str2 -- D:\Tool\自制小东西
            FileCopyTool(file, tc, file.getPath().replace("\\" + file.getName(), ""));
            System.out.println("文件夹复制完成");
        } else {
            // 传入的file是文件
            File file2 = new File(tc);
            // 确保上级目录tc存在
            if(!file2.exists()){
                file2.mkdirs();
            }
            try {
            // 调用同名方法复制文件
                FileCopy(new FileOutputStream(tc + "\\" + name), new FileInputStream(file.getPath()));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            System.out.println("文件复制完毕");
        }
    }

    public void FileCut(String tc, String name, File file){
        // 文件剪切
        System.out.println("正在开发,敬请期待! ");
    }


    public void testAllin(FileOperatorMain fom, String path){
        // 测试文件删除
        File ft = new File(path);
        fom.allin(ft);
        System.out.println("文件删除成功");
    }
    public void testFileCopy(FileOperatorMain fom, String target_path, String start_path){
        // 测试文件拷贝
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream(start_path);
            fos = new FileOutputStream(target_path);
            fom.FileCopy(fos, fis);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if(fis != null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
    public void testFileCopyPlus(FileOperatorMain fom, String target_path,String source_path, String... name){
        // 测试文件复制       --文件夹
        // 第二个参数对文件夹复制完全没用,回头还得改进
        System.out.println("文件复制开始");
        File file2 = new File(source_path);
        if(file2.isDirectory()){
            name[0] = "";
//            System.out.println();
        } else {
            // TODO
            if(name[0] != null){
                File file_tem = new File(source_path);
                name[0] = file_tem.getName();
            }
        }
        fom.FileCopy(target_path, name[0], file2);
        System.out.println("文件复制完成");
    }
    public void testFileCut(FileOperatorMain fom, String target_path, File file){
        // 测试文件剪切, 就是复制完回头把自己删了
        fom.FileCut(target_path, "", file);
    }

}
